package main

import (
	"context"
	"crawler/datasource"
	"crawler/grpc/save-rpc"
	"crawler/models"
	"fmt"
	"google.golang.org/grpc"
	"net"
)

var ch = make(chan save.SendToDbRequest, 20)

type rpcServer struct{}

// 获取usersData 的rpc服务
func (s *rpcServer) SendToDb(ctx context.Context,
	in *save.SendToDbRequest) (*save.SendToDbReplay, error) {

	ch <- *in
	return &save.SendToDbReplay{Message: "成功送达save模块"}, nil
}

// 将用户文章信息存储到mysql中
func InsertData(userData []models.UserData) {
	dbInstance := datasource.InstanceDbMaster()

	// 这里是批量插入，xorm会翻译成1个大的sql语句，如果其中有1个插入不成功，全部都会插入不成功
	i, err := dbInstance.Insert(&userData)
	if err != nil {
		fmt.Println("插入测试失败,error=", err, "改变数量=", i)
	}
	fmt.Println("成功插入数量：", i, "error=", err)
}

// rpc数据类型转换为mysql 表格数据类型
func TransRpcToDb(usersData save.SendToDbRequest) []models.UserData {
	res := []models.UserData{}
	if usersData.Users != nil && len(usersData.Users) > 1 {
		for _, buf := range usersData.Users {
			userData := models.UserData{
				ArticleId:  int(buf.ArticleId),
				ArticleUrl: buf.ArticleUrl,
				UserId:     buf.UserId,
			}
			res = append(res, userData)
		}
	}
	return res
}

// rpc服务初始化和启动
func bootstrapRpc() {
	listener, err := net.Listen("tcp", "0.0.0.0:29090")
	if err != nil {
		panic(err)
	}

	server := grpc.NewServer()

	save.RegisterSendToDbServer(server, &rpcServer{})

	fmt.Println("Listen on 0.0.0.0:29090")

	// 启动监听
	server.Serve(listener)
}
